package org.rujue.modules.sys.entity;

import java.io.Serial;
import java.util.Date;
import java.util.List;

import javax.validation.constraints.NotNull;

import cn.hutool.core.date.DateTime;
import cn.hutool.core.util.IdcardUtil;
import lombok.Data;
import org.hibernate.validator.constraints.Email;
import org.hibernate.validator.constraints.Length;

import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.google.common.collect.Lists;
import org.rujue.common.config.Global;
import org.rujue.common.persistence.DataEntity;
import org.rujue.common.utils.Collections3;
import org.rujue.common.utils.StringUtils;
import org.rujue.common.utils.excel.annotation.ExcelField;
import org.rujue.common.utils.excel.fieldtype.CompanyType;
import org.rujue.common.utils.excel.fieldtype.OfficeType;
import org.rujue.modules.sys.utils.DictUtils;

/**
 * 用户Entity
 * @author ThinkGem
 * @version 2013-12-05
 */
@Data
public class User extends DataEntity<User> {

	@Serial
	private static final long serialVersionUID = 1L;
	/** 公司 */
	private Office company;
	/** 部门 */
	private Office office;
	/** 用户账号 */
	private String loginName;
	/**	用户密码 */
	private String password;
	/** 用户工号 */
	private String no;
	/** 用户姓名 */
	private String name;
	/** 用户邮箱 */
	private String email;
	/** 用户电话 */
	private String phone;
	/** 用户手机号*/
	private String mobile;
	/**	用户学历 */
	private String educationalBackground;
	/**	用户职称 */
	private String professionalTitle;
	/** 用户类型 */
	private String userType;
	/** 用户最后登陆IP */
	private String loginIp;
	/** 用户最后登陆日期 */
	private Date loginDate;
	/** 是否允许登陆 */
	private String loginFlag;
	/** 是否销售停用 */
	private String saleStop;
	/** 头像 */
	private String photo;
	/** 证件类型 */
	private String credentialType;
	/** 证件号码 */
	private String credentialNo;
	/**	性别：0.女 1.男 */
	private String sex;
	/** 原登录名 */
	private String oldLoginName;
	/** 新密码 */
	private String newPassword;
	/** 原登录IP */
	private String oldLoginIp;
	/** 上次登陆日期 */
	private Date oldLoginDate;
	/** 根据角色查询用户条件 */
	private Role role;
	/** 角色列表 */
	private List<Role> roleList = Lists.newArrayList();

	public User() {
		super();
		this.loginFlag = Global.YES;
	}
	
	public User(String id){
		super(id);
	}

	public User(String id, String loginName){
		super(id);
		this.loginName = loginName;
	}

	public User(Role role){
		super();
		this.role = role;
	}
	
	@JsonIgnore
	@NotNull(message="归属公司不能为空")
	@ExcelField(title="归属公司",align=2, sort=10,fieldType = CompanyType.class)
	public Office getCompany() {
		return company;
	}

	@JsonIgnore
	@NotNull(message="归属部门不能为空")
	@ExcelField(title="归属部门",align=2, sort=20,fieldType = OfficeType.class)
	public Office getOffice() {
		return office;
	}

	@Length(min=1, max=100, message="姓名长度必须介于 1 和 100 之间")
	@ExcelField(title="用户姓名", align=2, sort=30)
	public String getName() {
		return name;
	}

	@Length(min=1, max=100, message="登录名长度必须介于 1 和 100 之间")
	@ExcelField(title="登录账号", align=2, sort=40)
	public String getLoginName() {
		return loginName;
	}

	@ExcelField(title="证件类型", align=2, sort=50,dictType="credential_type")
	public String getCredentialType() {
		return credentialType;
	}

	@ExcelField(title="证件编号", align=2, sort=60)
	public String getCredentialNo() {
		return credentialNo;
	}
	@ExcelField(title="性别", align=2, sort=70,dictType="sex")
	public String getSexLabel() {
		if(StringUtils.isNotBlank(credentialNo) && IdcardUtil.isValidCard(credentialNo)
				&& StringUtils.isNotBlank(credentialType) && credentialType.equals(Global.YES)){
			return 	String.valueOf(IdcardUtil.getGenderByIdCard(this.credentialNo));
		}
		return DictUtils.getDictLabel(sex, "sex", "异常数据");
	}

	@Length(min=0, max=200, message="邮箱长度必须介于 1 和 200 之间")
	@Email
	@ExcelField(title="邮箱", align=2, sort=80)
	public String getEmail() {
		return email;
	}

	@Length(min=0, max=200, message="电话长度必须介于 1 和 200 之间")
	@ExcelField(title="电话", align=2, sort=90)
	public String getPhone() {
		return phone;
	}

	@Length(min=0, max=200, message="手机长度必须介于 1 和 200 之间")
	@ExcelField(title="手机", align=2, sort=100)
	public String getMobile() {
		return mobile;
	}

	@Length(min=0, max=100, message="用户类型长度必须介于 1 和 100 之间")
	@ExcelField(title="用户类型", align=2, sort=110, dictTypes="sys_user_type")
	public String getUserType() {
		return userType;
	}

	@JsonIgnore
//	@ExcelField(title="拥有角色", align=1, sort=1200, fieldType=RoleListType.class)
	public List<Role> getRoleList() {
		return roleList;
	}

	@Length(min=1, max=100, message="工号长度必须介于 1 和 100 之间")
	public String getNo() {
		return no;
	}

	@JsonIgnore
	@Length(min=1, max=100, message="密码长度必须介于 1 和 100 之间")
	public String getPassword() {
		return password;
	}

	public String getRemarks() {
		return remarks;
	}
	public Date getCreateDate() {
		return createDate;
	}


	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
	public Date getLoginDate() {
		return loginDate;
	}

	public String getOldLoginIp() {
		if (oldLoginIp == null){
			return loginIp;
		}
		return oldLoginIp;
	}

	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
	public Date getOldLoginDate() {
		if (oldLoginDate == null){
			return loginDate;
		}
		return oldLoginDate;
	}

	@JsonIgnore
	public List<String> getRoleIdList() {
		List<String> roleIdList = Lists.newArrayList();
		for (Role role : roleList) {
			roleIdList.add(role.getId());
		}
		return roleIdList;
	}

	public void setRoleIdList(List<String> roleIdList) {
		roleList = Lists.newArrayList();
		for (String roleId : roleIdList) {
			Role role = new Role();
			role.setId(roleId);
			roleList.add(role);
		}
	}
	
	/**
	 * 用户拥有的角色名称字符串, 多个角色名称用','分隔.
	 */
	public String getRoleNames() {
		return Collections3.extractToString(roleList, "name", ",");
	}
	
	public boolean isAdmin(){
		return isAdmin(this.id);
	}
	
	public static boolean isAdmin(String id){
		return "1".equals(id);
	}
	
	@Override
	public String toString() {
		return id;
	}

	/** 获取出生年月 */
	public String getBirthYearMonth() {
		if(IdcardUtil.isValidCard(credentialNo)){
			DateTime birthDate = IdcardUtil.getBirthDate(this.credentialNo);
			if(birthDate != null){
				return birthDate.toString("yyyy-MM");
			}
		}
		return "异常";
	}

	public String getEducationalBackgroundLabel() {
		return DictUtils.getDictLabel(educationalBackground, "educational_background", "异常数据");
	}
	public String getProfessionalTitleLabel() {
		return DictUtils.getDictLabel(professionalTitle, "professional_title", "异常数据");
	}

}